package com.wh.wisdomsite.xbox.common;

import com.wh.wisdomsite.xbox.common.session.SessionManager;
import org.springframework.context.ApplicationContext;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.Set;

/**
 * 声明XboxContext请求接口
 * @Package com.wh.wisdomsite.xbox.common
 * @author 谢泽鹏
 * @date 2014年10月8日 下午4:02:14
 * @Copyright 个人版权所有
 * @Company 贵州万华科技有限公司Copyright (c) 2014
 * @version V1.0
 */
public interface XboxContext {


    /**
     * 获取SessionManager
     * @return
     */
    SessionManager getSessionManager();

    /**
     * 设置SessionManager
     * @param sessionManager
     */
    void setSessionManager(SessionManager sessionManager);


    /**
     * 是否启用签名
     * @return
     */
    boolean isSignEnable();

    /**
     * 设置签名
     * @param signEnable
     */
    void setSignEnable(boolean signEnable);


    /**
     * 添加方法
     * @param method  方法名
     * @param version 版本号
     * @param serviceMethodHandler 对象
     */
    void addServiceMethod(String method, String version, ServiceMethodHandler serviceMethodHandler);


    /**
     * 获取ServiceMethodHandler对象
     * @param method  方法名
     * @param version 版本号
     * @return
     */
    ServiceMethodHandler getServiceMthodHandler(String method, String version);


    /**
     * 是否存在该方法
     * @param method  方法名
     * @return
     */
    boolean containsMethod(String method);


    /**
     * 验证方法和版本是否存在
     * @param method  方法名
     * @param version 版本号
     * @return
     */
    boolean isValidMethod(String method, String version);


    /**
     * 获取所有ServiceHandler的Map集合
     * @return
     */
    Map<String, ServiceMethodHandler> getServiceHandlerMap();


    /**
     * 方法的唯一key ,区别方法(方法名 + $ + 版本号)
     * @param method
     * @param version
     * @return
     */
    String getMethodKey(String method, String version);


    /**
     * 扫描所有标记 @ServiceProvider @ServiceMethod的方法,并注册系统XboxContext中
     * @param applicationContext
     */
    void registerFromContext(ApplicationContext applicationContext);


    /**
     * 从注解生成方法定义,先获取类上的配置,若方法上也配置则直接覆盖掉.
     * @param method
     * @return
     */
    ServiceMethodDefinition bulidServiceMethodDefinition(Method method);


    /**
     * 获取所有方法
     * @return
     */
    Set<String> getServiceMethods();
}
